using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;

public class Lesson19 : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        #region 知识点一 事件查看窗口用来做什么？
        //使用可寻址事件查看窗口可以监视可寻址资源的资源内存管理
        //该窗口
        //1.显示应用程序何时加载和卸载资源
        //2.显示所有可寻址系统操作的引用计数
        //3.显示应用程序帧率和分配的内存总量近似图
        //我们可以通过它来检查可寻址资源对性能的影响
        //并检查没有释放的资源
        #endregion

        #region 知识点二 打开事件查看窗口
        //注意：使用事件查看窗口的前提要打开AddressablesAssetSettings配置文件中的事件发送开关
        //1.Window > Asset Management > Addressables > Event Viewer
        //2.Addressabeles Groups > Window > Event Viewer
        #endregion

        #region 知识点三 事件查看窗口使用
        //左上角：
        //Clear Event：清楚所有记录的帧，会清空窗口中所有内容
        //Unhide All Hidden Events：显示你隐藏的所有事件内容（当我们右键一个内容隐藏后才会显示该选项）

        //右上键：
        //Frame：显示当前所在帧数
        //左按钮和右按钮：在记录的帧中前后切换查看信息
        //Current:选中当前帧

        //中央部分：
        //FPS:应用的帧率
        //MonoHeap：正在使用的托管堆内存量
        //Event Counts：事件计数，某一帧中发生的可寻址事件的数量
        //Instantiation Counts:实例化计数，某一帧中Addressables.InstantiateAsync的调用数量
        //线性图标：显示统计的什么时候加载释放资源的信息

        //Event 相关：显示当前帧中发生的可寻址操作的事件
        #endregion

        #region 总结
        //事件查看窗口对于我们来说很有用
        //我们可以通过它来排查内存泄露相关的信息
        //比如场景中对象都被移除了，但是事件查看窗口中还有AB引用相关的信息，那证明存在内存泄露
        //可以排查加载和释放是否没有配对使用
        #endregion
    }

    private List<AsyncOperationHandle<GameObject>> list = new List<AsyncOperationHandle<GameObject>>();
    // Update is called once per frame
    void Update()
    {
        //创建对象 记录异步操作句柄
        if (Input.GetKeyDown(KeyCode.Space))
        {
            AsyncOperationHandle<GameObject> handle = Addressables.LoadAssetAsync<GameObject>("Cube");
            handle.Completed += (obj) =>
            {
                Instantiate(obj.Result);
            };
            list.Add(handle);
        }

        //从创建对象中 释放异步操作句柄资源
        if (Input.GetKeyDown(KeyCode.Q))
        {
            if (list.Count > 0)
            {
                Addressables.Release(list[0]);
                list.RemoveAt(0);
            }
        }
    }
}
